// struct sigaction
// {
//     void (*sa_handler)(int);
//     void (*sa_sigaction)(int, siginfo_t *, void *);
//     sigset_t sa_mask;
//     int sa_flags;
//     void (*sa_restorer)(void);
// };

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>
void handler(int sig)
{
    pid_t id;
    while ((id = waitpid(-1, NULL, WNOHANG)) > 0)
    {
        printf("wait child success: %d\n", id);
    }
    printf("child is quit! %d\n", getpid());
}
int main()
{
    signal(SIGCHLD, handler);
    pid_t cid;
    if ((cid = fork()) == 0)
    { // child
        printf("child : %d\n", getpid());
        sleep(3);
        exit(1);
    }
    while (1)
    {
        printf("father proc is doing some thing!\n");
        sleep(1);
    }
    return 0;
}
// #include <stdio.h>
// #include <signal.h>
// volatile int flag = 0;
// void handler(int sig)
// {
//     printf("chage flag 0 to 1\n");
//     flag = 1;
// }
// int main()
// {
//     signal(2, handler);
//     while (!flag)
//         ;
//     printf("process quit normal\n");
//     return 0;
// }

// #include <stdio.h>
// #include <signal.h>
// int flag = 0;
// void handler(int sig)
// {
//     printf("chage flag 0 to 1\n");
//     flag = 1;
// }
// int main()
// {
//     signal(2, handler);
//     while (!flag)
//         ;
//     printf("process quit normal\n");
//     return 0;
// }
// #include <stdio.h>
// #include <signal.h>
// int flag = 0;
// void handler(int sig)
// {
//     printf("chage flag 0 to 1\n");
//     flag = 1;
// }
// int main()
// {
//     signal(2, handler);
//     while (!flag)
//         ;
//     printf("process quit normal\n");
//     return 0;
// }

// #include <stdio.h>
// #include <unistd.h>
// #include <signal.h>
// void handler(int sig)
// {
//     printf("catch a sig : %d\n", sig);
//     sleep(1);
// }
// int main()
// {
//     signal(SIGSEGV, handler);
//     sleep(1);
//     int *p = NULL;
//     *p = 100;
//     while (1)
//         ;
//     return 0;
// }

// #include <stdio.h>
// #include <unistd.h>
// #include <signal.h>
// void handler(int sig)
// {
//     printf("catch a sig : %d\n", sig);
// }
// int main()
// {
//     // signal(SIGSEGV, handler);
//     sleep(1);
//     int *p = NULL;
//     *p = 100;
//     while (1)
//         ;
//     return 0;
// }

// #include <stdio.h>
// #include <signal.h>
// void handler(int sig)
// {
//     printf("catch a sig : %d\n", sig);
// }
// int main()
// {
//     signal(2, handler); // 信号是可以被自定义捕捉的，siganl函数就是来进行信号捕捉的
//     while (1)
//         ;
//     return 0;
// }

// int main()
// {
//     int count=14;
//     alarm(1);
//     for(;1;count++)
//     {
//         printf("count=%d\n",count);
//     }
//     return 0;
// }
// int main()
// {
//     while (1)
//     {
//         printf("I am a process, I am waiting signal!\n");
//         sleep(1);
//     }
// }